package com.gitee.huanminabc.jcommon.fastjson;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONValidator;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.util.TypeUtils;

import java.util.List;
import java.util.Map;

public class FastJsonUtil {
    static {
        FastJsonConfig.oftenUseConfig();
    }


    /**
     * 将对象转为json字符串 ,可以是单个对象，也可以是list map等
     *
     * @param object
     * @return
     */
    public static String toJson(Object object) {
        return JSON.toJSONString(object);
    }

    /**
     * 将json字符串转为Object实例
     *
     * @param json
     * @return
     */
    public static Object parse(String json) {
        return JSON.parse(json);
    }

    /**
     * 将json字符串转为指定类型的实例
     *
     * @param json
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> T parse(String json, Class<T> cls) {
        return JSON.parseObject(json, cls);
    }

    /**
     * 将json转为Map
     *
     * @param json
     * @param <T>
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> Map<String, T> toMap(String json) {
        return (Map<String, T>) JSONObject.parseObject(json);
    }

    //将对象转换为Map
    public static Map<String, Object> toMap(Object object) {
        return (JSONObject) JSON.toJSON(object);
    }


    //将Map转换为对象
    public static <T> T toObject(Map<String, Object> map, Class<T> cls) {
        try {
            return TypeUtils.castToJavaBean(map, cls);
        } catch(Exception e) {
            return JSON.parseObject(JSON.toJSONString(map), cls);
        }
    }

    /**
     * 将json转为指定类型的List
     *
     * @param json
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> List<T> toList(String json, Class<T> cls) {
        return JSON.parseArray(json, cls);
    }


    /**
     * @param json 必须是 JSONArray 或者JSONObject 才会进行样式转换
     * @return
     */
    public static String pretty(Object json) {
        return JSON.toJSONString(json, SerializerFeature.PrettyFormat);
    }

    //判断是否是json格式
    public static boolean isJson(String json) {
        try (JSONValidator from = JSONValidator.from(json)){
            return from.validate();
        } catch (Exception e) {
            return false;
        }
    }

    //简易版的校验是否是json格式,用于在某些必然是json场景用
    public static boolean isJsonSimple(String json) {
        return json.startsWith("{") && json.endsWith("}") || json.startsWith("[") && json.endsWith("]");
    }

}
